<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="X-UA-Compatible" content="IE=edge"><meta name="author" content="imp"><title>Redis笔记 · imp的个人博客</title><meta name="description" content="Redis
基础篇
NoSQL




SQl
NoSQL




数据结构
结构化(Structured)
非结构化


数据关联
关联的(Relational)
无关联的


查询方式
SQL查询
非SQL


事务特性
ACID
BASE


存储方式
磁盘
内存


扩展性
垂直
水平


"><meta name="keywords" content="imp,blog"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta id="site_root_url" data="/"><meta id="default-theme" data="light"><meta name="renderer" content="webkit"><link rel="shortcut icon" type="image/x-icon" href="/images/icon.png"><link rel="stylesheet" href="/css/theme/light.css"><link rel="stylesheet" href="/css/style.css"><link rel="stylesheet" href="/css/blog_basic.css"><link rel="stylesheet" href="/css/font-awesome.min.css"><link rel="stylesheet" href="/css/insight.css"><link rel="stylesheet" href="/css/search.css"><link rel="alternate" type="application/atom+xml" title="ATOM 1.0" href="/atom.xml"><script src="/js/url_for.js"></script><script src="/js/friends-link-generator.js"></script><script src="/js/jquery.js"></script><script src="/js/jquery-migrate-1.2.1.min.js"></script><script src="/js/jquery.appear.js"></script><script src="/js/site.js"></script><script src="/js/router.js"></script><script src="/js/darkLightToggle.js"></script><script src="/js/add-bookmark.js"></script><meta name="generator" content="Hexo 6.3.0"></head><body><main-outlet><div class="page-top animated"><div class="nav"><li> <a href="/">首页</a></li><li> <a href="/archives">归档</a></li><li> <a href="/tags">标签</a></li><li> <a href="/about">关于</a></li><li> <a href="/links">友链</a></li></div><div class="information"><div class="nav_right_btn"><li><a class="fa fa-chevron-left" onclick="window.history.go(-1)"> </a></li><li><a class="fa fa-search" onclick="openWindow();"></a></li><li><a class="fa fa-sun-o" onclick="darkLightToggle();"></a></li></div><div class="avatar"><img src="/images/logo.webp"></div></div></div><div class="toc-mobile"><div class="toc-button"><span>目录</span></div><div class="toc-container in-page animated fadeInDown"><div class="toclist-container"><div class="tocmenu"><ol class="toclist"><li class="toclist-item toclist-level-1"><a class="toclist-link"><span class="toclist-text">Redis</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-2"><a class="toclist-link" href="#%E5%9F%BA%E7%A1%80%E7%AF%87"><span class="toclist-text">基础篇</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#NoSQL"><span class="toclist-text">NoSQL</span></a></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#%E8%AE%A4%E8%AF%86Redis"><span class="toclist-text">认识Redis</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%89%B9%E5%BE%81%EF%BC%9A"><span class="toclist-text">特征：</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D"><span class="toclist-text">Redis数据结构介绍</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Redis%E9%80%9A%E7%94%A8%E5%91%BD%E4%BB%A4"><span class="toclist-text">Redis通用命令</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#String%E7%B1%BB%E5%9E%8B"><span class="toclist-text">String类型</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#String%E7%9A%84%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E6%9C%89%EF%BC%9A"><span class="toclist-text">String的常见命令有：</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Key%E7%9A%84%E7%BB%93%E6%9E%84"><span class="toclist-text">Key的结构</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#Hash%E7%B1%BB%E5%9E%8B"><span class="toclist-text">Hash类型</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Hash%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4"><span class="toclist-text">Hash类型的常见命令</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#List%E7%B1%BB%E5%9E%8B"><span class="toclist-text">List类型</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#List%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4"><span class="toclist-text">List类型的常见命令</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#SpringDataRedis"><span class="toclist-text">SpringDataRedis</span></a></li></ol></li><li class="toclist-item toclist-level-2"><a class="toclist-link" href="#%E5%AE%9E%E6%88%98%E7%AF%87"><span class="toclist-text">实战篇</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98"><span class="toclist-text">缓存</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E6%B7%BB%E5%8A%A0Redis%E7%BC%93%E5%AD%98"><span class="toclist-text">添加Redis缓存</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5"><span class="toclist-text">缓存更新策略</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF"><span class="toclist-text">业务场景</span></a></li></ol></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F"><span class="toclist-text">缓存穿透</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"><span class="toclist-text">解决方案</span></a></li></ol></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9"><span class="toclist-text">缓存雪崩</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9A"><span class="toclist-text">解决方案：</span></a></li></ol></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF"><span class="toclist-text">缓存击穿</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E4%BA%92%E6%96%A5%E9%94%81"><span class="toclist-text">互斥锁</span></a></li><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E9%80%BB%E8%BE%91%E8%BF%87%E6%9C%9F"><span class="toclist-text">逻辑过期</span></a></li></ol></li></ol></li></ol></li></ol></li></ol></div></div></div></div><div class="sidebar animated"><div class="sidebar-top"><div class="logo-title"><div class="title"><img src="/images/avatar.png" style="width:220px;" alt="favicon"><h3 title=""><a href="/">imp的个人博客</a></h3><div class="description"><p>A simple blog</p></div></div><ul class="social-links"><li><a target="_blank" rel="noopener" href="https://github.com/Dimp07"><i class="fa fa-github"></i></a></li><li><a href="mailto:610634344@qq.com"><i class="fa fa-envelope"></i></a></li></ul></div><div class="toc-container in-sidebar animated fadeInDown"><details class="ltr" open><summary>目录</summary><div class="toclist-container"><div class="tocmenu"><ol class="toclist"><li class="toclist-item toclist-level-1"><a class="toclist-link"><span class="toclist-text">Redis</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-2"><a class="toclist-link" href="#%E5%9F%BA%E7%A1%80%E7%AF%87"><span class="toclist-text">基础篇</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#NoSQL"><span class="toclist-text">NoSQL</span></a></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#%E8%AE%A4%E8%AF%86Redis"><span class="toclist-text">认识Redis</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%89%B9%E5%BE%81%EF%BC%9A"><span class="toclist-text">特征：</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D"><span class="toclist-text">Redis数据结构介绍</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Redis%E9%80%9A%E7%94%A8%E5%91%BD%E4%BB%A4"><span class="toclist-text">Redis通用命令</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#String%E7%B1%BB%E5%9E%8B"><span class="toclist-text">String类型</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#String%E7%9A%84%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E6%9C%89%EF%BC%9A"><span class="toclist-text">String的常见命令有：</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Key%E7%9A%84%E7%BB%93%E6%9E%84"><span class="toclist-text">Key的结构</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#Hash%E7%B1%BB%E5%9E%8B"><span class="toclist-text">Hash类型</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#Hash%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4"><span class="toclist-text">Hash类型的常见命令</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#List%E7%B1%BB%E5%9E%8B"><span class="toclist-text">List类型</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#List%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4"><span class="toclist-text">List类型的常见命令</span></a></li></ol></li><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#SpringDataRedis"><span class="toclist-text">SpringDataRedis</span></a></li></ol></li><li class="toclist-item toclist-level-2"><a class="toclist-link" href="#%E5%AE%9E%E6%88%98%E7%AF%87"><span class="toclist-text">实战篇</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-3"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98"><span class="toclist-text">缓存</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E6%B7%BB%E5%8A%A0Redis%E7%BC%93%E5%AD%98"><span class="toclist-text">添加Redis缓存</span></a></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5"><span class="toclist-text">缓存更新策略</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF"><span class="toclist-text">业务场景</span></a></li></ol></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F"><span class="toclist-text">缓存穿透</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"><span class="toclist-text">解决方案</span></a></li></ol></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9"><span class="toclist-text">缓存雪崩</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9A"><span class="toclist-text">解决方案：</span></a></li></ol></li><li class="toclist-item toclist-level-4"><a class="toclist-link" href="#%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF"><span class="toclist-text">缓存击穿</span></a><ol class="toclist-child"><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E4%BA%92%E6%96%A5%E9%94%81"><span class="toclist-text">互斥锁</span></a></li><li class="toclist-item toclist-level-5"><a class="toclist-link" href="#%E9%80%BB%E8%BE%91%E8%BF%87%E6%9C%9F"><span class="toclist-text">逻辑过期</span></a></li></ol></li></ol></li></ol></li></ol></li></ol></div></div></details></div></div><div class="footer"><div class="p"> <span>  </span><i class="fa fa-star"></i><span> imp</span></div><div class="by_farbox"><span>Powered by </span><a href="https://hexo.io/zh-cn/" target="_blank">Hexo </a><span> & </span><a href="https://github.com/Lhcfl/hexo-theme-anatolo" target="_blank">Anatolo </a></div><div class="beian"></div></div></div><div class="main animated fadeInDown"><div class="autopagerize_page_element"><div class="content"><div class="post-page"><div class="post animated"><div class="post-title"><h3><a>Redis笔记</a></h3></div><div class="post-content"><p><h1>Redis</h1>
<h2 id="基础篇">基础篇</h2>
<h3 id="NoSQL">NoSQL</h3>
<table>
<thead>
<tr>
<th style="text-align:center"></th>
<th style="text-align:center">SQl</th>
<th style="text-align:center">NoSQL</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">数据结构</td>
<td style="text-align:center">结构化(Structured)</td>
<td style="text-align:center">非结构化</td>
</tr>
<tr>
<td style="text-align:center">数据关联</td>
<td style="text-align:center">关联的(Relational)</td>
<td style="text-align:center">无关联的</td>
</tr>
<tr>
<td style="text-align:center">查询方式</td>
<td style="text-align:center">SQL查询</td>
<td style="text-align:center">非SQL</td>
</tr>
<tr>
<td style="text-align:center">事务特性</td>
<td style="text-align:center">ACID</td>
<td style="text-align:center">BASE</td>
</tr>
<tr>
<td style="text-align:center">存储方式</td>
<td style="text-align:center">磁盘</td>
<td style="text-align:center">内存</td>
</tr>
<tr>
<td style="text-align:center">扩展性</td>
<td style="text-align:center">垂直</td>
<td style="text-align:center">水平</td>
</tr>
<tr>
<td style="text-align:center">使用场景</td>
<td style="text-align:center">1）数据结构固定<br />2）相关业务对数据库安全性、<br />一致性要求较高</td>
<td style="text-align:center">1）数据结构不固定<br />2）对一致性、安全性要求不高<br />3）对性能要求</td>
</tr>
</tbody>
</table>
<h3 id="认识Redis">认识Redis</h3>
<p>Redis诞生于2009年全称是Remote Dictionary Server，远程词典服务器，是一个基于内存的键值型NoSQL数据库。</p>
<h4 id="特征：">特征：</h4>
<ul>
<li>键值（key-value）型，value支持多种不同数据结构，功能丰富</li>
<li>单线程，每个命令具备原子性</li>
<li>低延迟，速度快（基于内存、IO多路复用、良好的编码）</li>
<li>支持数据持久化</li>
<li>支持主从集群、分片集群</li>
<li>支持多语言客户端</li>
</ul>
<h4 id="Redis数据结构介绍">Redis数据结构介绍</h4>
<p>Redis是一个key-value的数据库，key一般是String类型，不过value的类型多种多样：</p>
<ul>
<li>String：hello world</li>
<li>Hash：{name：“Jack”, age: “21”}</li>
<li>List: {A -&gt; B -&gt; C}</li>
</ul>
<h4 id="Redis通用命令">Redis通用命令</h4>
<p>通用指令是部分数据类型的，都可以使用的指令，常见的有：</p>
<ul>
<li>KEYS：查看符合模板的所有key，不建议在生产环境设备上使用</li>
<li>DEL：删除一个指定的key</li>
<li>EXISTS：判断key是否存在</li>
<li>EXPIRE：给一个key设置有效期，有效期到期时该key会被自动删除</li>
<li>TTL：查看一个KEY的剩余有效期</li>
</ul>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231221163233895.png" class="" title="image-20231221163233895">
<h3 id="String类型">String类型</h3>
<p>String类型，也就是字符串类型，是Redis中最简单的存储类型。</p>
<p>其value是字符串，不过根据字符串的格式不同，又可以分为3类:</p>
<ul>
<li>string：普通字符串</li>
<li>int：整数类型，可以做自增、自减操作</li>
<li>float：浮点类型，可以做自增、自减操作</li>
</ul>
<p>不管是哪种格式，底层都是字节数组形式存储，只不过是编码方式不同。字符串类型的最大空间不能超过512m</p>
<p>String类型的常见命令</p>
<h4 id="String的常见命令有：">String的常见命令有：</h4>
<ul>
<li>SET：添加或者修改已经存在的一个String类型的键值对</li>
<li>GET：根据key获取String类型的value</li>
<li>MSET：批量添加多个String类型的键值对</li>
<li>MGET：根据多个key获取多个String类型的valueI</li>
<li>INCR：让一个整型的key自增1</li>
<li>INCRBY:让一个整型的key自增并指定步长，例如：incrby num 2让num值自增2</li>
<li>INCRBYFLOAT：让一个浮点类型的数字自增并指定步长</li>
<li>SETNX：添加一个String类型的键值对，前提是这个key不存在，否则不执行</li>
<li>SETEX：添加一个String类型的键值对，并且指定有效期</li>
</ul>
<h4 id="Key的结构">Key的结构</h4>
<p>Redis的key允许有多个单词形成层级结构，多个单词之间用’:隔开，格式如下：</p>
<blockquote>
<p>项目名：业务名：类型：id</p>
</blockquote>
<p>这个格式并非固定，也可以根据自己的需求来删除或添加词条。例如我们的项目名称叫 heima，有user和product两种不同类型的数据，我们可以这样定义key:</p>
<ul>
<li>user相关的key:<code>heima:user:1</code></li>
<li>product相关的key:<code>heima:product:1</code></li>
</ul>
<h3 id="Hash类型">Hash类型</h3>
<p>Hash类型，也叫散列，其value是一个无序字典，类似于Java中的HashMap结构。</p>
<p>String结构是将对象序列化为JSON字符串后存储，当需要修改对象某个字段时很不方便：</p>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231221170046320.png" class="" title="image-20231221170046320">
<p>Hash结构可以将对象中的每个字段独立存储，可以针对单个字段做CRUD:</p>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231221170101542.png" class="" title="image-20231221170101542">
<h4 id="Hash类型的常见命令">Hash类型的常见命令</h4>
<p>Hash的常见命令有：</p>
<ul>
<li>HSET keyfield value：添加或者修改hash类型key的field的值</li>
<li>HGET keyfield：获取一个hash类型key的field的值</li>
<li>HMSET：批量添加多个hash类型key的field的值</li>
<li>HMGET：批量获取多个hash类型key的field的值</li>
<li>HGETALL：获取一个hash类型的key中的所有的field和value</li>
<li>HKEYS：获取一个hash类型的key中的所有的field</li>
<li>HVALS：获取一个hash类型的key中的所有的value</li>
<li>HINCRBY:让一个hash类型key的字段值自增并指定步长</li>
<li>HSETNX：添加一个hash类型的key的field值，前提是这个field不存在，否则不执行</li>
</ul>
<h3 id="List类型">List类型</h3>
<p>Redis中的List类型与Java中的LinkedList类似，可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。</p>
<p>特征也与LinkedList类似：</p>
<ul>
<li>有序</li>
<li>元素可以重复</li>
<li>插入和删除快</li>
<li>查询速度</li>
</ul>
<p>一般常用来存储一个有序数据，例如：朋友圈点赞列表，评论列表等。</p>
<h4 id="List类型的常见命令">List类型的常见命令</h4>
<p>List的常见命令有：</p>
<ul>
<li>LPUSH key element…：向列表左侧插入一个或多个元素</li>
<li>LPOP key：移除并返回列表左侧的第一个元素，没有则返回nil</li>
<li>RPUSH key element…：向列表右侧插入一个或多个元素</li>
<li>RPOP key：移除并返回列表右侧的第一个元素</li>
<li>LRANGE key star end：返回一段角标范围内的所有元素</li>
<li>BLPOP和BRPOP：与LPOP和RPOP类似，只不过在没有元素时等待指定时间，而不是直接返回nil</li>
</ul>
<h3 id="SpringDataRedis">SpringDataRedis</h3>
<p>SpringData是Spring中数据操作的模块，包含对各种数据库的集成，其中对Redis的集成模块就叫做SpringDataRedis</p>
<ul>
<li>提供了对不同Redis客户端的整合（Lettuce和Jedis）</li>
<li>提供了RedisTemplate统一APl来操作Redis</li>
<li>支持Redis的发布订阅模型</li>
<li>支持Redis哨兵和Redis集群</li>
<li>支持基于Lettuce的响应式编程</li>
<li>支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化</li>
<li>支持基于Redis的JDKCollection实现</li>
</ul>
<h2 id="实战篇">实战篇</h2>
<h3 id="缓存">缓存</h3>
<h4 id="添加Redis缓存">添加Redis缓存</h4>
<p>先在redis中查询，如果没有查询到就转到数据库中查询；如果数据库中没有则返回错误，否则将数据写入redis中，再返回数据。</p>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231225202137954.png" class="" title="image-20231225202137954">
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231225202318920.png" class="" title="image-20231225202318920">
<h4 id="缓存更新策略">缓存更新策略</h4>
<p>因为redis缓存中的数据与数据库不一定一致，所以需要去更新redis缓存中的数据。</p>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231226185324010.png" class="" title="image-20231226185324010">
<h5 id="业务场景">业务场景</h5>
<ul>
<li>低一致性需求：使用内存淘汰机制。例如店铺类型的查询缓存</li>
<li>高一致性需求：主动更新，并以超时剔除作为兜底方案。</li>
</ul>
<p>先操作数据库，再操作redis缓存</p>
<h4 id="缓存穿透">缓存穿透</h4>
<p><strong>缓存穿透</strong>是指客户端请求的数据在缓存中和数据库中都不存在，这样缓存永远不会生效，这些请求都会打到数据库。</p>
<h5 id="解决方案">解决方案</h5>
<p><strong>缓存null值</strong>：为了防止不怀好意的人使用null查询，将数据库搞崩，可以先将第一次查询的null存入到redis缓存中，使后面每次使用null查询都查询到redis缓存中，减少对数据库的影响。</p>
<p><strong>布隆过滤器</strong>：</p>
<h4 id="缓存雪崩">缓存雪崩</h4>
<p><strong>缓存雪崩</strong>是指在同一时段大量的缓存key同时失效或者Redis服务岩机，导致大量请求到达数据库，带来巨大压力。</p>
<h5 id="解决方案：">解决方案：</h5>
<ul>
<li>不同的Key的TTL添加随机值。使不会在同一时间内有大量缓存key失效，减少redis宕机可能</li>
<li>利用Redis集群提高服务的可用性</li>
<li>给缓存业务添加降级限流策略</li>
<li>给业务添加多级缓存</li>
</ul>
<h4 id="缓存击穿">缓存击穿</h4>
<p><strong>缓存击穿</strong>问题也叫热点Key问题，就是一个被<strong>高并发访问</strong>并且<strong>缓存重建业务较复杂</strong>的key突然失效了，无数的请求访问会在瞬间给数据库带来巨大的冲击。</p>
<p>常见的解决方案有两种：</p>
<ul>
<li>互斥锁</li>
<li>逻辑过期</li>
</ul>
<h5 id="互斥锁">互斥锁</h5>
<p>基本流程：</p>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231227170203515.png" class="" title="image-20231227170203515">
<p>互斥锁的实现：使用<code>SETEX：添加一个String类型的键值对，并且指定有效期</code>，当首个用户访问时若是缓存未命中，则<code>SEREX</code>，并且执行查询数据库操作，保证后面的用户访问缓存时<code>SEREX</code>会返回<code>0</code>（表示已存在），这样后面的用户就重复<code>SEREX</code>，直到缓存更新完成。</p>
<h5 id="逻辑过期">逻辑过期</h5>
<p>基本流程：</p>
<img src="/2023/12/20/Redis%E7%AC%94%E8%AE%B0/image-20231227184647925.png" class="" title="image-20231227184647925">
<p>逻辑过期的实现：理论上来说是会缓存命中（热点key再一开始就会缓存好，未命中表示该商品已经不在活动范围内），命中后判断缓存是否过期，这里缓存若是过期了，第一个用户则单独开启一个线程执行互斥锁，但如果是后面的用户获取，与互斥锁不同，得到的数据是之前的数据，不需要等待。</p>
</p></div><div class="post-footer"><div class="meta"><div class="info"><i class="fa fa-sun-o"></i><span class="date">2023-12-20</span><i class="fa fa-tag"></i><a class="tag" href="/tags/Redis/" title="Redis">Redis </a><span class="leancloud_visitors"></span><span>大约2334个字, 7分钟46秒读完</span></div></div></div></div><div class="share"><div class="evernote"><a class="fa fa-bookmark" href="" onclick="javascript:join_favorite()" ref="sidebar"></a></div><div class="weibo"><a class="fa fa-weibo" href="javascript:void((function(s,d,e){try{}catch(e){}var f='http://service.weibo.com/share/share.php?',u=d.location.href,p=['url=',e(u),'&amp;title=',e(d.title),'&amp;appkey=2924220432'].join('');function a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=620,height=450,left=',(s.width-620)/2,',top=',(s.height-450)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})(screen,document,encodeURIComponent));"></a></div><div class="twitter"><a class="fa fa-twitter" target="_blank" rel="noopener" href="http://twitter.com/intent/tweet?text=%E5%88%86%E4%BA%AB%E6%96%87%E7%AB%A0%EF%BC%9A%0A%0Aimp%E7%9A%84%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%20%C2%B7%20Redis%E7%AC%94%E8%AE%B0%0Ahttp://example.com/2023/12/20/Redis%E7%AC%94%E8%AE%B0/%0A"></a></div></div><div class="pagination"><ul class="clearfix"><li class="pre pagbuttons"><a class="btn" role="navigation" href="/2023/12/20/SpringBoot%E7%9A%84%E7%AC%94%E8%AE%B0/" title="SpringBoot的笔记">上一篇</a></li><li class="next pagbuttons"><a class="btn" role="navigation" href="/2023/12/16/%E7%AE%97%E6%B3%95%E7%AC%94%E8%AE%B0/" title="算法笔记">下一篇</a></li></ul></div><script src="/js/visitors.js"></script></div></div></div></div></main-outlet><script>(function(window){var INSIGHT_CONFIG={TRANSLATION:{POSTS:"文章",PAGES:"页面",CATEGORIES:"分类",TAGS:"标签",UNTITLED:"(无标题)",},CONTENT_URL:"/content.json",};window.INSIGHT_CONFIG=INSIGHT_CONFIG})(window);</script><script src="/js/insight.js" defer></script><div class="searchbox ins-search"><div class="searchbox-container ins-search-container"><div class="searchbox-input-wrapper"><input class="searchbox-input ins-search-input" type="text" placeholder="想要查找什么..."><span class="searchbox-close"><a class="fa fa-times-circle" onclick="closeWindow();"></a></span></div><div class="searchbox-result-wrapper ins-section-wrapper"><div class="ins-section-container"><p>Seraching...</p></div></div></div></div></body></html>